package com.smart.community.region.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.smart.community.region.dto.ZoneQueryDTO;
import com.smart.community.region.dto.ZoneInfoUpdateDTO;
import com.smart.community.region.entity.Zone;
import com.smart.community.region.vo.ZoneDetailVO;
import com.smart.community.region.vo.ZoneWithBuildingsVO;

import java.util.List;

/**
 * 分区服务接口
 *
 * @author Wu.Liang
 * @since 2025-01-30
 */
public interface IZoneService extends IService<Zone> {

    /**
     * 分页查询分区列表
     *
     * @param page 分页参数
     * @param queryDTO 查询条件
     * @return 分页结果
     * @throws Exception 查询异常
     */
    IPage<Zone> getZonePage(Page<Zone> page, ZoneQueryDTO queryDTO) throws Exception;

    /**
     * 根据ID查询分区详情
     *
     * @param id 分区ID
     * @return 分区详情
     * @throws Exception 查询异常
     */
    ZoneDetailVO getZoneDetail(Long id) throws Exception;

    /**
     * 更新分区基本信息
     *
     * @param id 分区ID
     * @param dto 更新数据
     * @param currentUserId 当前用户ID
     * @return 更新结果
     * @throws Exception 更新异常
     */
    boolean updateZoneInfo(Long id, ZoneInfoUpdateDTO dto, Long currentUserId) throws Exception;

    /**
     * 根据社区ID查询分区列表
     *
     * @param communityId 社区ID
     * @return 分区列表
     */
    List<ZoneWithBuildingsVO> getByCommunityId(Long communityId);

    /**
     * 根据物业公司ID查询分区列表
     *
     * @param propertyCompanyId 物业公司ID
     * @return 分区列表
     */
    List<Zone> getByPropertyCompanyId(Long propertyCompanyId);

    /**
     * 检查分区编码是否存在（在指定社区内）
     *
     * @param zoneCode 分区编码
     * @param communityId 社区ID
     * @param excludeId 排除的分区ID（用于更新时检查）
     * @return 是否存在
     */
    boolean isZoneCodeExists(String zoneCode, Long communityId, Long excludeId);

    /**
     * 批量保存分区
     *
     * @param zones 分区列表
     * @return 是否成功
     */
    boolean saveBatchZones(List<Zone> zones);

    /**
     * 批量更新分区
     *
     * @param zones 分区列表
     * @return 是否成功
     */
    boolean updateBatchZones(List<Zone> zones);
}
